/*
 * Systemprogrammierung
 * Multiplayer-Quiz
 *
 * Server
 * 
 * login.c: Implementierung des Logins
 */

#include "common/rfc.h"
#include "user.h"
#include "login.h"
#include <stdbool.h>
#include <pthread.h>
#include <string.h>
#include "clientthread.h"

/*
 * Login_Thread Start
 *
 *
 *
 */
void* login_main(int sock) {
	PACKET packet;
	packet.header.type = 0;
	packet.header.length = 0;
	int client_socket;
	int client_id;

    // Initialisiere Userdaten-Mutex
    if (create_user_mutex() == -1) {
            pthread_exit(NULL);
    }
    pthread_t client[4];
	// Empfaenger-Schleife
	while (1) {
		// Warte auf Connection-Request
		if (listen(sock, 128) == 0) {
			// Bei erfolgreichem Request wird Connection aufgebaut
			client_socket = accept(sock, 0, 0);
			if (client_socket == -1) {
				perror("Client Socket Connection Fehler");
				exit(0);
			}
			// Bei Funktionierender Connection
			infoPrint("Client Verbunden! Warte auf Request...");
			packet = packetLesen(client_socket);
			PACKET response;
			infoPrint("Empfangenes Packet Typ: %i", packet.header.type);
			if(packet.header.type == 1){
				user_mutex_lock();
				client_id = addPlayer(packet.content.playername,
						ntohs(packet.header.length), client_socket);
				user_mutex_unlock();
				// Name bereits vorhanden
				if (client_id == -1) {
					perror("Name bereits vorhanden");
					response.header.type = RFC_ERRORWARNING;
					response.header.length = htons(sizeof(ERROR));
					response.content.error.errortype = 1; // Fatal Error: Client schließt
					strncpy(response.content.error.errormessage, "Name bereits vorhanden", 100);
				} else if (client_id >= 4) { // Zu viele Spieler angemeldet
					perror("Zu viele Spieler");
					response.header.type = RFC_ERRORWARNING;
					response.header.length = htons(sizeof(ERROR));
					response.content.error.errortype = 1;
					strncpy(response.content.error.errormessage, "Zu viele Spieler", 100);
				} else { // Wenn die ID korrekt ist: ResponseOK senden
					infoPrint("Erfolgreich geaddet! Client-ID: %i", client_id);
					response.header.type = RFC_LOGINRESPONSEOK;
					response.header.length = htons(sizeof(uint8_t));
					response.content.clientid = client_id;
				}// response senden
				packetSchreiben(response, client_socket);
				 //Client-Thread erstellen
				pthread_create(&client[client_id], NULL,(void *) &client_thread_main,  &client_id);
				// PLAYERLIST an alle Senden
				sendPlayerList();
			}
		}
	}
	pthread_exit(0);
	return NULL ;
}

